package com.example.mq.mqserver.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;

@Data
public class Exchange {
    //此处使用name来作为交换机的身份标识（唯一的）
    private String name;
    //交换机类型，DIRECT,FANOUT,TOPIC
    private ExchangeType type=ExchangeType.DIRECT;//默认直接交换机
    //表示该交换机是否需要持久化，true表示需要持久化
    private boolean durable=false;//持久化开关
    //如果当前交换机，没人使用了，就会自动删除
    //这个属性暂时列在这里，后续代码中并没有真的实现这个自动删除功能（rabbitMQ是有的）
    private boolean autoDelete=false;
    //arguments表示的是创建交换机是指定的一些额外的参数选项，后续代码中没有实现
    //为了把这个arguments存到数据库中，就需要把Map转成json格式的字符串
    private Map<String,Object> arguments=new HashMap<>();

    public String getArguments(){
        //是把当前的 arguments参数，从 map转成 String（JSON）
        ObjectMapper objectMapper=new ObjectMapper();
        try {
            return objectMapper.writeValueAsString(arguments);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //如果代码真的异常了，返回一个空的 json对象
        return "{}";
    }

    //这个方法，是从数据库读取数据之后，构造Exchange对象，会自动调用到
    public void setArguments(String argumentsJson) {
        ObjectMapper objectMapper=new ObjectMapper();
        //把JSON字符串，转为map
        //如果是个简单类型，直接使用对应类型的类对象即可
        //如果是集合类这样的复杂类型，可以使用 TypeReference匿名内部类对象，来描述复杂类型的具体信息（通过泛型参数来描述的）
        try {
            this.arguments=objectMapper.readValue(argumentsJson, new TypeReference<HashMap<String,Object>>(){});
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
    //这里针对arguments，再提供一组getter和setter，用来去更方便的获取/设置键值对
    //在Java内部使用，比如测试的时候使用
    public Object getArguments(String key){
        return arguments.get(key);
    }

    public void setArguments(String key,Object value){
        arguments.put(key,value);
    }

    public void setArguments(Map<String,Object> arguments){
        this.arguments=arguments;
    }

}
